/**
 * Class 中的泛型和函数中的泛型非常类似，
 * 只不过函数中泛型参数的消费方是参数和返回值类型，
 * Class 中的泛型消费方则是属性、方法、乃至装饰器等。
 * 同时 Class 内的方法还可以再声明自己独有的泛型参数。
*/
class Queue<TElementType> {
    private _list: TElementType[];

    constructor(initial: TElementType[]) {
        this._list = initial;
    }

    // 入队一个队列泛型子类型的元素，入参类型 TType 被约束为 队列类型的子类型
    enqueue<TType extends TElementType>(ele: TType): TElementType[] {
        this._list.push(ele);
        return this._list;
    }

    // 入队一个任意类型元素（无需为队列泛型子类型），
    //方法中的 TType 类型参数不会受约束，它会在其被调用时再对应地填充，同时也会在返回值类型中被使用。
    enqueueWithUnknownType<TType>(element: TType): (TElementType | TType)[] {
        return [...this._list, element];
    }

    // 出队
    dequeue(): TElementType[] {
        this._list.shift();
        return this._list;
    }
}

//export {}：解决“无法重新声明块范围变量”错误提示问题
export { }